home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1995 August: Tool Chest / Dev.CD Aug 95 TC / Dev.CD Aug 95 TC.toast / Tool Chest / Development Tools & Languages / Dylan Related / Mindy / Mindy 1.2 - portable sources / compat / sigaction.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-03-15  |  3.3 KB  |  146 lines  |  [TEXT/ttxt]

  1. /*
  2.  * This file implements an emulation of POSIX sigaction() and sigsuspend()
  3.  * in terms of BSD sigvec() and sigpause() or SYSV.3 sigset() and sigpause().
  4.  *
  5.  * This remains untested until some poor soul with no POSIX libraries tries
  6.  * to use it.
  7.  */
  8.  
  9. /*
  10.  * configure may not have figured out which to use.
  11.  */
  12. #if !defined(BSD_SIGNALS) && !defined(USG_SIGNALS)
  13. #define BSD_SIGNALS    1
  14. #endif
  15.  
  16. #if BSD_SIGNALS
  17. #define _BSD_SIGNALS    1        /* this is how Irix turns bsd signals on */
  18. #define _BSD_COMPAT    1
  19. #endif
  20.  
  21. #include <stdio.h>
  22. #include <errno.h>
  23. #include <signal.h>
  24. #include "std-signal.h"
  25.  
  26. /*
  27.  * these are common to the emulations.
  28.  */
  29. int sigaddset(sigset_t *set, int sig) { return *set |= (1<<(sig-1)); }
  30. int sigdelset(sigset_t *set, int sig) { return *set &= ~(1<<(sig-1)); }
  31. int sigemptyset(sigset_t *set) { return *set = 0; }
  32. int sigfillset(sigset_t *set) { *set = 0xFFFFFFFF; }
  33. int sigismember(sigset_t *set, int sig) { return (*set & (1<<(sig-1))) != 0; }
  34.  
  35. #if BSD_SIGNALS
  36.  
  37. #ifdef hpux
  38. #define sigvec    sigvector
  39. #endif
  40.  
  41. int sigaction(sig, sa, osa) int sig; struct sigaction *sa, *osa;
  42. {
  43.   struct sigvec sv = { 0 }, osv;
  44.   sv.sv_mask = sa->sa_mask;
  45.   sv.sv_handler = (int (*)())sa->sa_handler;
  46.   if (osa) {
  47.     sigvec(sig, &sv, &osv);
  48.     osa->sa_handler = (void (*)())osv.sv_handler;
  49.     osa->sa_mask = osv.sv_mask;
  50.   } else {
  51.     sigvec(sig, &sv, NULL);
  52.   }
  53. }
  54.  
  55. int sigsuspend(set) sigset_t *set;
  56. {
  57.   if (set)
  58.     sigpause(*set);
  59.   else
  60.     sigpause(0);
  61. }
  62.  
  63. int sigprocmask(int operation, sigset_t *set, sigset_t *oset)
  64. {
  65.   int new, old, sig;
  66.   switch (operation) {
  67.   case SIG_NOP:
  68.     old = sigsetmask(0xFFFFFFFF);
  69.     sigsetmask(old);
  70.     break;
  71.   case SIG_BLOCK:
  72.     if ( ! set) { errno = EINVAL; return -1; }
  73.     new = old = sigsetmask(0xFFFFFFFF);
  74.     for (sig = 1; sig < NSIG; sig += 1)
  75.       if (sigismember(set, sig))
  76.     new |= sigmask(sig);
  77.     sigsetmask(new);
  78.     break;
  79.   case SIG_UNBLOCK:
  80.     if ( ! set) { errno = EINVAL; return -1; }
  81.     new = old = sigsetmask(0xFFFFFFFF);
  82.     for (sig = 1; sig < NSIG; sig += 1)
  83.       if (sigismember(set, sig))
  84.     new &= ~sigmask(sig);
  85.     sigsetmask(new);
  86.     break;
  87.   case SIG_SETMASK:
  88.     if ( ! set) { errno = EINVAL; return -1; }
  89.     new = 0;
  90.     for (sig = 1; sig < NSIG; sig += 1)
  91.       if (sigismember(set, sig))
  92.     new |= sigmask(sig);
  93.     old = sigsetmask(new);
  94.     break;
  95.   }
  96.   if (oset) *oset = old;
  97.   return 0;
  98. }
  99.  
  100. #elif USG_SIGNALS
  101.  
  102. int sigaction(sig, sa, osa) int sig; struct sigaction *sa, *osa;
  103. {
  104.   if (osa)
  105.     osa->sa_handler = sigset(sig, sa->sa_handler);
  106.   else
  107.     sigset(sig, sa->sa_handler);
  108. }
  109.  
  110. int sigsuspend(set) sigset_t *set;
  111. {
  112.   sigpause(0);
  113. }
  114.  
  115. int sigprocmask(int operation, sigset_t *set, sigset_t *oset)
  116. {
  117.   int new, old, sig;
  118.   switch (operation) {
  119.   case SIG_NOP:
  120.     break;
  121.   case SIG_BLOCK:
  122.     if ( ! set) { errno = EINVAL; return -1; }
  123.     for (sig = 1; sig < NSIG; sig += 1)
  124.       if (sigismember(set, sig))
  125.     sighold(sig);
  126.     break;
  127.   case SIG_UNBLOCK:
  128.     if ( ! set) { errno = EINVAL; return -1; }
  129.     for (sig = 1; sig < NSIG; sig += 1)
  130.       if (sigismember(set, sig))
  131.     sigrelse(sig);
  132.     break;
  133.   case SIG_SETMASK:
  134.     if ( ! set) { errno = EINVAL; return -1; }
  135.     for (sig = 1; sig < NSIG; sig += 1)
  136.       if (sigismember(set, sig))
  137.     sighold(sig);
  138.       else
  139.     sigrelse(sig);
  140.     break;
  141.   }
  142.   if (oset) *oset = 0;
  143.   return 0;
  144. }
  145. #endif
  146.